#ifndef SH_SINGLETON_SINGLETON_HPP
#define SH_SINGLETON_SINGLETON_HPP


namespace sh {

template<class T>
struct Singleton {
    Singleton() = delete;
    ~Singleton() = delete;
    static T* getInstance();
};

template<class T>
inline auto instance() {
    return Singleton<T>::getInstance();
}

/*
* //////////////////////////////////////////////////////////////////////////////////////////
*
*
*
* //////////////////////////////////////////////////////////////////////////////////////////
*/

template<class T>
inline T* Singleton<T>::getInstance() {
    static T instance;
    return &instance;
}


} // namespace sh

#endif // SH_SINGLETON_SINGLETON_HPP
